﻿using AddNotUseMVVM.Commands;
using AddUseMVVM.ViewModel;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace AddNotUseMVVM.ViewModel.ViewModelImpl
{
    /// <summary>
    /// 对MainWindow这个UI进行建模
    /// </summary>
    internal class MainWindowViewModel:NotificationObject
    {
        #region 数据属性
        #region 第一个数据属性
        private double input1;

        public double Input1
        {
            get { return input1; }
            set 
            { 
                input1 = value;
                this.RaisePropertyChanged("Input1");
            }
        }
        #endregion

        #region 第二个数据属性
        private double input2;

        public double Input2
        {
            get { return input2; }
            set
            {
                input2 = value;
                this.RaisePropertyChanged("Input2");
            }
        }
        #endregion

        #region 第三个数据属性
        private double result;

        public double Result
        {
            get { return result; }
            set
            {
                result = value;
                this.RaisePropertyChanged("Result");
            }
        }
        #endregion
        #endregion

        #region 命令属性

        #region 第一个命令属性
        public DelegateCommand AddCommand { get; set; }

        /// <summary>
        /// AddCommand命令属性所做的操作就是两个输入值，想加，并把求和的结果赋值给result第三个数据值
        /// </summary>
        /// <param name="parameter"></param>
        private void Add(object parameter)
        {
            //进行求和之后，这一个回去调这三个数据属性自己的属性中的set方法中的这一句：this.RaisePropertyChanged("result");，通过这一句告诉关联在这个数据属性上的DataBindling说，目前你DataBindling关注的叫做Result的这个值，已经发生变化了。然后呢RaisePropertyChanged会触发PropertyChanged这个事件，因为DataBinding是一直没日没夜在盯着这个PropertyChanged这个事件，这个PropertyChanged这个事件发生了，DataBinging就会拿着这个propertyname去对比，一看发生变化了，就赶紧把最新的值送到界面上去
            this.Result = this.Input1 + this.Input2;
        }
        #endregion

        #region 第二个命令属性
        public DelegateCommand SaveCommand { get; set; }

        /// <summary>
        /// SaveCommand命令属性所做的操作就是通过点击保存按钮把求和的结果赋值保存一下
        /// </summary>
        /// <param name="parameter"></param>
        private void Save(object parameter)
        {
            //进行求和之后，这一个回去调这三个数据属性自己的属性中的set方法中的这一句：this.RaisePropertyChanged("result");，通过这一句告诉关联在这个数据属性上的DataBindling说，目前你DataBindling关注的叫做Result的这个值，已经发生变化了。然后呢RaisePropertyChanged会触发PropertyChanged这个事件，因为DataBinding是一直没日没夜在盯着这个PropertyChanged这个事件，这个PropertyChanged这个事件发生了，DataBinging就会拿着这个propertyname去对比，一看发生变化了，就赶紧把最新的值送到界面上去
            new SaveFileDialog().ShowDialog();
        }
        #endregion

        public MainWindowViewModel()
        {
            //下面这两句是完成命令属性与具体操作的关联
            this.AddCommand = new DelegateCommand();
            this.AddCommand.ExecuteAction = new Action<object>(this.Add);

            this.SaveCommand = new DelegateCommand();
            this.SaveCommand.ExecuteAction = new Action<object>(this.Save);
        }
        #endregion
    }
}
